package com.jh.complicate.netty.buffer;

import java.io.FileInputStream;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author Administrator
 * @projectName newforward
 * @title ByteBufferDem.java
 * @package com.jh.complicate.netty.buffer
 * @description ByteBuffer使用案例
 * @date 2019/6/23 17:20
 */
public class ByteBufferDemo {
    public static void main(String[] args) throws Exception{
        // 文件IO读入
        FileInputStream fin = new FileInputStream("D://test.txt");
        // 获取文件操作管道
        FileChannel fc = fin.getChannel();

        // 初始化缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(10);
        output("init", buffer);

        // 将通道数据读取到缓冲区
        fc.read(buffer);
        output("read：", buffer);

        // 准备操作之前，锁定操作范围
        buffer.flip();
        output("filp", buffer);

        // 判断有没有数据
        while (buffer.hasRemaining()) {
            // 有数据就使用get获取
            byte b = buffer.get();
        }
        output("get", buffer);

        // 解锁，还原状态
        buffer.clear();
        output("clear", buffer);

        // 关闭通道和流
        fin.close();
    }

    private static void output(String step, Buffer buffer) {
        System.out.println(step + "：");
        // 容量
        System.out.print(" capacity：" + buffer.capacity());
        // 下一个操作元素的索引
        System.out.print(" position：" + buffer.position());
        // 锁定值，操作范围只能是position-limit之间
        System.out.print(" limit：" + buffer.limit());
        System.out.println(" ");
    }
}
